perm filename IBMDSK[D,SYS] blob
sn#260117 filedate 1977-02-01 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00020 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00003 00002 TITLE IBMDSK
C00005 00003 LOC 200
C00008 00004 BITS FOR COMMAND WORD
C00010 00005 DEFINE MES(A)
C00012 00006 UUO HANDLER
C00013 00007 HANDLE THE CTY.
C00015 00008 UUO ROUTINES, GETWRD
C00018 00009 DDTCAL: OUTSTR [ASCIZ/*DDT*/]
C00024 00010 SKIP: CAIE A,12
C00026 00011 DOREAD, DOWRITE, TRKSET, READ, WRITE, RDR0
C00031 00012 THE FOLLOWING CODE READS GRIMM'S FAIRY TALES FROM A 370 FORMAT PACK.
C00037 00013 FORMAT: TDZA T,T
C00040 00014 FORMAT ONE TRACK
C00044 00015 SEEKIT: SETZM SKDAT
C00048 00016 DOSENSE:PUSHJ P,SENSE
C00050 00017 DIAG: PUSHJ P,LOAD
C00053 00018 DOCMD: TRNE A,20000 SHOULD WE SEND WCMA
C00057 00019 ESENSE: AOS ERRCNT
C00060 00020 STTPNT: OUTSTR[ASCIZ/CONI BITS = /]
C00062 ENDMK
C⊗;
TITLE IBMDSK
EXTERNAL DDT
.LOAD SYS:EDDT.REL
LOC 74
JRST DDT ;KEEP SYMBOLS AROUND
RELOC
P←17
A←1
B←2
C←3
D←4
E←5
F←6
ISTAT←13 ;INITIAL STATUS STORED HERE
T←14
TT←15
TTT←16
APR←←0
PMP←←500
IBM←←504
TTY←←120
CCA←←14
KLPAG←←10
SWEEPB←←200000 ;SWEEP BUSY IN KL10 APR CONI.
;KL10 TO CONSOLE
DTE←←200
DONG11←←20000 ;RING 11'S DOORBELL
DTFLG←←444 ;DTE20 OPERATION COMPLETE FLAG (RELATIVE TO EPT)
DTF11←←450 ; 10 FROM 11 ARGUMENT
DTCMD←←451 ; TO 11 COMMAND WORD
;CONI BITS FOR PMP
UNEND←←440000 ;UNEND AND PARITY ERROR
CHE←←200000
NEWST←←20000
;STATUS BITS
STMOD←←4000
CUEND←←2000
BUSY←←1000
CHEND←←400
DEVEND←←200
UCHK←←100
UXCPTN←←40
;LEFT HALF BIT FOR CONI PMP (500)
SELERR←←40000 ;SELECT ERROR
;CONO BITS FOR IBM (504)
CLREND←←4000 ;CLEAR UN END
CNEWST←←200
CLRSTS←←40
CLRCHL←←20 ;CLEAR COMMAND HOLD LOADED
IRESET←←2
RESET←←1
NOPLIN←←10000 ;NOT OPL IN (CONI 504)
;DEVICE ADDRESSES
D3330←←14
LOC 200
BEGIN: JRST STRT ;DISPATCH TO MAIN LOOP
JRST DDT ;DISPATCH TO DDT
RSTLOC: JRST STRT ;SET TO RESTART LOC BY STRT
LOC 1000 ;LEAVE ROOM FOR KL10 EPT AT PHYSICAL ZERO
R2:
SPOPJ2:
CPOPJ2: AOS (P)
R1:
SPOPJ1:
CPOPJ1: AOS (P)
R:
CPOPJ: POPJ P,
PPOPJ: POP P,(P)
POPJ P,
DEBUG: 0
DEFINE DEBCHECK
{ SKIPE DEBUG
PUSHJ P,DDTCAL
}
STATLEN←←100
DEFINE GETSTAT
{ CONI PMP,ISTAT
CONO IBM,CNEWST
TRNE ISTAT,UNEND
CONO IBM,CLRCHL
AOSL T,STATPNT
JRST [ MOVNI T,STATLEN
MOVEM T,STATPNT
JRST .+1]
MOVEM ISTAT,STATEND(T)
}
;DATA AREA
STATBEG: BLOCK STATLEN
STATEND←←.
STATPNT: 0
RWFIRST: 0
RWLAST: 0
RWLOC: 0
SRCNUM: 0
OSFMTF: 0 ;SET TO -1 FOR WRITING OS-370 FORMAT
RECNM1: 0 ;SET TO FIRST RECORD NUMBER DESIRED,
;OR -1 FOR ENTIRE NORMAL TRACK
RECNM2: 0 ;SET TO LAST RECORD DESIRED, OR -1 FOR NORMAL
SKIPF: 0 ;SET TO -1 TO SKIP RETURN FROM READN
RETLEN←←40
RETBYT←←RETLEN/2*9
RECLEN←←200
RECBYT←←RECLEN/2*9
IFL RECLEN-RETLEN,<PRINTX CODE EXPECTS RETLEN ≤ RECLEN>
KEYBYT←←60*9/2 ;PAD RECORD 0 KEY WITH 60 WORDS
MAXDRV←←7
TRKCYL←←=19
CYLPC1←←=411 ;SINGLE DENSITY
CYLPAC←←=815 ;DOUBLE DENSITY
MAXTRK←←TRKCYL*CYLPAC-1 ;NUMBER OF TRACKS-1
RCPTRK←←=18
TRACK: 0 ;TRACK NUMBER IS KEPT HERE
DRIVE: 0
ADDR: D3330⊗=17 ;DEVICE CODE FOR DATAO
TSTXOR: D3330⊗=27 ;XOR TEST AT ESTAT
ISTATC: 0
RWCMD: 0
ECOUNT: 0
PATCH: BLOCK 200 ;PATCH SPACE
PDL: BLOCK 1000
RTYCNT: 0 ;COUNT OF NUMBER OF RETRIES
CUBCNT: 0 ;COUNT OF NUMBER OF CONTROL UNIT BUSY SEQUENCES
ERRCNT: 0 ;COUNT OF NUMBER OF CALLS ON ESENSE
QUIET: 0 ;NO PRINTOUT FROM ESENSE IF ON
CNT: 0 ;PLACE TO KEEP TRY COUNT
CRLF: BYTE (7) 15,12,0
KLFLG: 0 ;NON ZERO IF THIS IS A KL10
UUOLOC: 0 ;ADDRESS OF THE UUO IMAGE AND TRAP INSTRUCTION WORDS
;BITS FOR COMMAND WORD
DT←←20000 ;COMMAND REQUIRES DATA TRANSFER
BY4←←10000 ;4 BYTE MODE
CB←←4000 ;COUNT BYTES (NOT WORDS)
CHAIN←←2000 ;COMMAND CHAINING
SMT←←1000 ;SKIP IF STATUS MODIFIER ON
SMF←←400 ; " " " " OFF
TSTBUF: BLOCK =512/4+2
ERRBUF: BLOCK =512/4+2
FILMSK: BYTE(8)300 ;PERMIT ALL WRITES
SKDAT: BLOCK 2
SKCYL: POINT 16,SKDAT,31
SKHD: POINT 8,SKDAT+1,15
HADAT: BLOCK 2
HACYL: POINT 16,HADAT,23
HAHD: POINT 8,HADAT+1,7
SNSDAT: BLOCK 10
DEFINE BYTIT(BUF,BYT)
{ XWD <(<POINT 8,0,7+8*(BYT-BYT/4*4)>)>,BUF+BYT/4
}
AREA←←400000
B0DAT←←AREA
BNDAT←←B0DAT+4
BMDAT←←BNDAT+4
ENDDAT←←BMDAT+3
TRKBUF←←ENDDAT+1
DATBEG←←TRKBUF+RCPTRK*200+40+2
W0CYL: POINT 16,B0DAT,15
W0HD: BYTIT B0DAT,3
W0KL: BYTIT B0DAT,5
W0DL0: BYTIT B0DAT,6
W0DL1: BYTIT B0DAT,7
WNCYL: POINT 16,BNDAT,15
WNHD: BYTIT BNDAT,3
WNRN: BYTIT BNDAT,4
WNDL0: BYTIT BNDAT,6
WNDL1: BYTIT BNDAT,7
WMCYL: POINT 16,BMDAT,15
WMHD: BYTIT BMDAT,3
WMRN: BYTIT BMDAT,4
WMDL0: BYTIT BMDAT,6
WMDL1: BYTIT BMDAT,7
DEFINE MES(A)
{ [ASCIZ/A
/]
}
SNBY0: MES SEEK CHECK
MES TRACK CONDITION CHECK
MES OVERRUN
MES DATA CHECK
MES EQUIPMENT CHECK
MES BUS OUT PARITY
MES INTERVENTION REQUIRED
MES COMMAND REJECT
SNBY1: MES OVERFLOW INCOMPLETE
MES WRITE LOCK.
MES FILE PROTECTED
MES NO RECORD FOUND
[0]
MES END OF CYLINDER
MES INVALID TRACK FORMAT
MES PERMANENT ERROR
DSTAT: 14,,MES OK
114,,MES OK
10,,MES OK
104,,MES OK
4,,MES OK
16,,MES ERROR
6,,MES ERROR
120,,MES CONTROL UNIT BUSY
160,,MES CONTROL UNIT BUSY AND END
112,,MES COMMAND RETRY
116,,MES COMMAND RETRY
1,,MES END OF FILE
15,,MES END OF FILE
11,,MES END OF FILE
DSTATL←←.-DSTAT
STATAB: MES ATTENTION
MES STATUS MODIFIER
MES CU END
MES BUSY
MES CHAN END
MES DEV END
MES UNIT CHECK
MES UNIT XCPTN
;UUO HANDLER
OPDEF PUTCHR[1B8]
OPDEF GETCHR[2B8]
OPDEF OUTSTR[3B8]
OPDEF OCTPNT[4B8]
OPDEF LOCPNT[5B8]
OPDEF DECPNT[6B8]
OPDEF SIXOUT[7B8]
OPDEF ERROR[10B8] ;THIS MUST BE AN LUUO FOR THE KL10
UUOCON: 0
PUSH P,UUOCON ;SAVE THE RETURN ADDRESS
PUSH P,T
PUSH P,TT
PUSH P,TTT
LDB T,[POINT 9,@UUOLOC,8]
CAIL T,UUOLEN
MOVEI T,0
PUSHJ P,@UUODIS(T)
UUORET: POP P,TTT
POP P,TT
POP P,T
POPJ P,
UUODIS: ERR
%PUTCHR
%GETCHR
%OUTSTR
%OCTPNT
%LOCPNT
%DECPNT
%SIXOUT
ERR
UUOLEN←←.-UUODIS
ERR: OUTSTR[ASCIZ/π?
/]
POPJ P,
;HANDLE THE CTY.
DTEXX: MOVEM T,DTCMD
SETZM DTFLG ;CLEAR 11'S RESPONSE FLAG
CONO DTE,DONG11 ;RING FOR 11
SKIPN DTFLG ;WAIT FOR RESPONSE
JRST .-1
MOVE T,DTF11 ;GET 11'S RESPONSE WORD
POPJ P,
KLTYO: PUSH P,T
ANDI T,177
PUSHJ P,DTEXX
POP P,T
POPJ P,
KLTYI: MOVEI T,3400
PUSHJ P,DTEXX
JUMPE T,CPOPJ
CAIL T,"A"+40
CAILE T,"Z"+40
CAIA
SUBI T,40
JRST CPOPJ1
PUTTTY: SKIPE KLFLG
JRST KLTYO
CONSZ TTY,20 ;LAST OUTPUT DONE?
JRST .-1
DATAO TTY,T ;ECHO
POPJ P,
SKPTTI: SKIPE KLFLG ;IF NO INPUT, RETURN; ELSE READ IT AND SKIP
JRST KLTYI
CONSO TTY,40 ;ANY INPUT?
POPJ P, ;NO.
DATAI TTY,T
ANDI T,177
JRST CPOPJ1
GETTTY: PUSHJ P,SKPTTI ;ANY INPUT?
JRST .-1 ;NO WAIT FOR IT.
CAIN T,177 ;RUBOUT?
JRST RUBOUT
PUSHJ P,PUTTTY ;ECHO
CAIE T,15 ;CR?
CAIN T,12
CAIA
POPJ P,
PUSH P,T
TRC T,7 ;CHANGE 15 TO 12 AND VICE VERSA
PUSHJ P,PUTTTY
POP P,T
POPJ P,
RUBOUT: MOVEI T,"X"
PUSHJ P,PUTTTY
MOVEI T,"X"
PUSHJ P,PUTTTY
MOVEI T,"X"
PUSHJ P,PUTTTY
MOVEI T,15
PUSHJ P,PUTTTY
MOVEI T,12
PUSHJ P,PUTTTY
JRST MAIN ;MAIN WILL RESET THE STACK
;UUO ROUTINES, GETWRD
%OUTSTR:HRRZ TT,@UUOLOC ;GET EFFECTIVE ADDRESS OF UUO
HRLI TT,(<POINT 7,0>)
ILDB T,TT
JUMPE T,CPOPJ
PUSHJ P,PUTTTY
JRST .-3
%PUTCHR:PUSH P,T
HRRZ T,@UUOLOC
PUSHJ P,PUTTTY
POP P,T
POPJ P,
%GETCHR:PUSH P,T
PUSHJ P,GETTTY
PUSH P,TT
HRRZ TT,@UUOLOC ;EFFECTIVE ADDRESS OF UUO
MOVEM T,(TT)
POP P,TT
POP P,T
POPJ P,
%OCTPNT:HRRZ TT,@UUOLOC ;EFFECTIVE ADDRESS OF UUO
MOVE TT,(TT) ;FETCH WORD
MOVEI TTT,=12
OCTLOP: SETZ T,
LSHC T,3
ADDI T,60
PUSHJ P,PUTTTY
SOJG TTT,OCTLOP
POPJ P,
%DECPNT:SKIPA T,[=10]
%LOCPNT:MOVEI T,10
MOVE TT,@UUOLOC
MOVE TT,(TT)
LOCLOP: IDIVI TT,(T)
HRLM TTT,(P)
JUMPE TT,.+2
PUSHJ P,LOCLOP
HLRZ T,(P)
ADDI T,60
JRST PUTTTY
%SIXOUT:MOVE TT,@UUOLOC
MOVE TT,(TT)
SIXOU1: JUMPE TT,CPOPJ
SETZ T,
LSHC T,6
ADDI T,40
PUSHJ P,PUTTTY
JRST SIXOU1
GETWRD: SETZ B,
MOVE C,[POINT 6,B]
GETWR1: GETCHR A
CAIGE A,"0"
POPJ P,
CAIG A,"9"
JRST CHROK
CAIGE A,"A"
POPJ P,
CAILE A,"Z"
POPJ P,
CHROK: SUBI A,40
TLNE C,770000
IDPB A,C
JRST GETWR1
READN: SETZB T,SKIPF ;GET A NUMBER. SKIPS IF NUMBER SEEN
READN1: GETCHR A
CAIL A,"0"
CAILE A,"9"
JRST SKPOPJ ;SKIP OR NOT
IMULI T,=10
ADDI T,-60(A)
SETOM SKIPF
JRST READN1
SKPOPJ: SKIPE SKIPF
AOS (P)
POPJ P,
GETYES: OUTSTR [ASCIZ/GO ON?/]
GETYS1: GETCHR A
OUTSTR CRLF
CAIN A,"D"
JRST DDTCAL ;GO TO DDT
CAIN A,"Y"
AOS (P)
POPJ P,
DDTCAL: OUTSTR [ASCIZ/*DDT*/]
JRST DDT
STRT: SETZM KLFLG ;ASSUME NOT A KL10
MOVE T,[T,,T]
BLT T,T
CAME T,[T,,T]
SETOM KLFLG
SKIPE KLFLG
JRST KLSTRT ;DO KL10 INITIALIZATION.
CONO APR,10000 ;CLEAR NXM FLAG
SETZ T,
NXMCHK: MOVE (T)
CAIG T,777777
CONSZ APR,10000 ;NXM?
JRST NXMDON
ADDI T,20000 ;INC BY 8K
JRST NXMCHK
NXMDON: SUBI T,1
MOVEM T,37 ;SET JOBREL TO FIRST NXM-1
MOVE T,[JSR UUOCON]
MOVEM T,141
MOVEI T,140
MOVEM T,UUOLOC
JRST RESTRT
KLSTRT: DATAO KLPAG,[400100,,0] ;START OUT WITH SOME DECENT ACS
CONSZ APR,SWEEPB ;WAIT FOR SWEEP BUSY TO FALL
JRST .-1
CONSO KLPAG,600000 ;IS THE CACHE ON ALREADY?
JRST KLSTR1 ;NO.
BLKO CCA, ;VALIDATE CORE
CONSZ APR,SWEEPB
JRST .-1
KLSTR1: CONO KLPAG,0 ;NO CACHE, EPT TO ZERO. NO MAP, NO TRAPS
DATAI CCA,0 ;SWEEP CACHE. INVALIDATE ALL.
CONSZ APR,SWEEPB ;WAIT FOR SWEEP BUSY TO FALL
JRST .-1
MOVEI T,-1
MOVEM T,37 ;SET JOBREL FOR DDT.
MOVE T,[JSR UUOCON]
MOVEM T,41
MOVEI T,40
MOVEM T,UUOLOC
RESTRT: SETZM STATPNT ;INITIALIZE STATUS SAVER
MOVE T,[JRST RESTRT] ;SETUP RESTART LOC
MOVEM T,RSTLOC
SETOM RECNM1 ;ASSUME NORMAL TRACK READS & WRITES
SETOM RECNM2
MOVE P,[IOWD 1000,PDL]
CONO APR,200000 ;IO RESET
OUTSTR CRLF
PUSHJ P,BLAST ;CLEAR CHANNEL
SETZM QUIET ;START LOUD
PUSHJ P,CNTPNT ;FLUSH OUT COUNTS
MAIN: MOVE P,[IOWD 1000,PDL]
PUTCHR "*"
PUSHJ P,GETWRD
CAIN A,"?"
JRST DOHELP
MOVSI T,770000
SETZ D,
MAINLM: TDNE B,T
TDO D,T
LSH T,-6
JUMPN T,MAINLM
MOVSI C,-DISLEN
SETZ TT,
MAINLP: CAMN B,COMTAB(C)
JRST GOTITL
MOVE T,COMTAB(C)
AND T,D
CAME T,B
JRST MAINLQ
JUMPN TT,MAINLS
MOVE TT,C
MAINLQ: AOBJN C,MAINLP
JUMPE TT,MAINLS
SKIPA C,TT
GOTIT1: GETCHR A
GOTITL: CAIE A,40
CAIN A,11
JRST GOTIT1 ;IGNORE SPACES AND TABS AFTER COMMAND
CAIE A,"/" ;SET SOMETHING?
JRST GOTCOM ;NO
GETCHR A
CAIN A,"P"
JRST SETPAK
CAIN A,"T"
JRST SETTRK
CAIN A,"C"
JRST CYLHD
CAIN A,"R" ;SET RECORD NUMBER TO READ - IN 4-BYTE MODE
JRST SETREC
JRST MAINLS
SETPAK: PUSHJ P,READN
JFCL
CAILE T,MAXDRV
JRST ILLDRV
MOVEM T,DRIVE
DPB T,[POINT 3,ADDR,21]
LDB T,[POINT 8,ADDR,21]
DPB T,[POINT 8,TSTXOR,11]
JRST GOTITL
SETTRK: PUSHJ P,READN
JFCL
TRKCHK: CAILE T,MAXTRK
JRST ILLTRK
MOVEM T,TRACK
JRST GOTITL
SETREC: PUSHJ P,READN
JRST SETRC1 ;NO NUMBER
MOVEM T,RECNM1 ;SET FIRST RECORD NUMBER TO READ/WRITE
CAIN A,"-" ;/Rn1-n2 SETS LOWER AND UPPER RECORD NUMBERS
PUSHJ P,READN
MOVE T,RECNM1 ;DEFAULT VALUE IS SAME AS FIRST
MOVEM T,RECNM2 ;SET LAST RECORD NUMBER TO READ/WRITE
JRST GOTITL ;ALLOWS NONSTANDARD FMTS
SETRC1: SETOM RECNM1 ;/R WITH NO NUMBER MEANS ENTIRE TRACK
SETOM RECNM2 ;IN NORMAL FORMAT
JRST GOTITL
CYLHD: PUSHJ P,READN
JFCL
MOVE B,T
IMULI B,TRKCYL
SETZ T,
CAIN A,"+"
PUSHJ P,READN
JFCL
ADD T,B
JRST TRKCHK
GOTCOM: CAIE A,12
CAIN A,15
CAIA
JRST MAINLS
XCT COMDIS(C)
JRST MAIN
ILLDRV: OUTSTR [ASCIZ/ILLEGAL DRIVE
/]
JRST MAINLS
ILLTRK: OUTSTR[ASCIZ/ILLEGAL TRACK
/]
MAINLS: PUSHJ P,SKIP
JRST [OUTSTR CRLF
JRST MAIN]
ERROR
JRST MAIN
DOHELP: PUSH P,[MAIN] ;SET RETURN ADDRESS
HELP: MOVE A,[-DISLEN+1,,1]
OUTSTR CRLF
HELPL: SIXOUT COMTAB(A)
OUTSTR CRLF
PUSHJ P,SKPTTI ;ANY TYPEIN? READ IT AND SKIP.
AOBJN A,HELPL ;NO TYPEIN, CONTINUE TYPEOUT
POPJ P,
SKIP: CAIE A,12
CAIN A,15
JRST CPOPJ1
CAIN A,176 ;ALTMODE
POPJ P, ;ALTMODE RETURN
GETCHR A
JRST SKIP
COMTAB: 0
'DDT '
'FORMAT'
'READ '
'WRITE '
'SENSE '
'NOOP '
'SEEK '
'HAREAD'
'RECAL '
'SECTOR'
'RSECTO'
'BLAST '
'IBLAST'
'ERRCNT'
'QUIET '
'TALK '
'RRBL '
'TEST '
'UTEST '
'LOAD '
'RDR0 ' ;READ R0 - ASSUMES NOTHING ABOUT FORMAT?
'OSFMT ' ;FORMAT A PACK FOR OS-370 TO READ
'HELP '
DISLEN←←.-COMTAB
COMDIS: JFCL
PUSHJ P,DDTCAL
PUSHJ P,FORMAT
PUSHJ P,DOREAD
PUSHJ P,DOWRITE
PUSHJ P,DOSENSE
PUSHJ P,DONOOP
PUSHJ P,DOSEEK
PUSHJ P,HAREAD
PUSHJ P,DORECAL
PUSHJ P,SECTOR
PUSHJ P,RSECTOR
PUSHJ P,BLAST
PUSHJ P,IBLAST
PUSHJ P,CNTPNT
SETOM QUIET
SETZM QUIET
PUSHJ P,BUFLOG
PUSHJ P,DIAG
PUSHJ P,UDIAG
PUSHJ P,DOLOAD
PUSHJ P,RDR0
PUSHJ P,OSFMT
PUSHJ P,HELP
; DOREAD, DOWRITE, TRKSET, READ, WRITE, RDR0
RDR0: SETZM RECNM1 ;SET FOR RECORD 0 ONLY
SETZM RECNM2
DOREAD: PUSHJ P,TRKSET
PUSHJ P,READ
OUTSTR [ASCIZ/READ ERROR!
/]
POPJ P,
DOWRITE:PUSHJ P,TRKSET
PUSHJ P,WRITE
OUTSTR [ASCIZ/WRITE ERROR!
/]
POPJ P,
TRKSET: SKIPGE T,RECNM1 ;SKIP IF FIRST RECORD WAS SPECIFIED
MOVEI T,0 ;NORMAL ENTIRE TRACK MODE
MOVEM T,RWFIRST ;SET FIRST RECORD NUMBER TO READ
SKIPGE T,RECNM2 ;SKIP IF LAST RECORD NUMBER WAS SPECIFIED
MOVEI T,RCPTRK ;NORMAL - DO ENTIRE TRACK
MOVEM T,RWLAST ;SET LAST RECORD TO READ
MOVEI T,TRKBUF
MOVEM T,RWLOC ;READ DATA INTO TRKBUF
POPJ P,
WRITE: SKIPA T,[CHAIN!DT!5]
READ: MOVEI T,CHAIN!DT!6
SKIPL RECNM1 ;SKIP IF THIS IS NORMAL READ/WRITE
IORI T,BY4 ;SET 4-BYTE MODE FOR SINGLE RECORD READ
MOVEM T,RWCMD ;SAVE READ/WRITE COMMAND
MOVE T,RWLAST ;LAST RECORD #
SUB T,RWFIRST ;-FIRST RECORD NUMBER
ADDI T,1 ;+1 = NUMBER OF RECORDS TO READ
IMULI T,3 ;RETRY EACH 3 TIMES
MOVEM T,ECOUNT
REDAGN: PUSHJ P,SEEKIT ;DO SEEK
JRST ECHK
SETZM BNDAT
SETZM BNDAT+1
MOVE T,TRACK
IDIVI T,TRKCYL
DPB T,WNCYL
DPB TT,WNHD
MOVE A,ADDR
TRO A,DT!BY4!CB!CHAIN!SMF!61 ;SEARCH ID EQUAL
MOVEI B,BNDAT
MOVE C,ADDR
TDO C,RWCMD
MOVE D,RWLOC ;DATA GOES TO (COMES FROM) HERE
MOVE E,RWFIRST ;FIRST RECORD
REREAD: DPB E,WNRN
SETZM SRCNUM
RSRCH: DATAO PMP,B
DATAO IBM,A
RSTUFF: CONSO PMP,CHE ;WAIT FOR COMMAND HOLD EMPTY
JRST .-1
CAML E,RWLAST
TRZ C,CHAIN ;CLEAR CHAINING ON LAST RECORD
DATAO PMP,D
DATAO IBM,C
PUSHJ P,ESTAT ;WAIT FOR ENDING STATUS OF SEARCH
JRST RSRCH1 ;RETRY SEARCH
JRST ECHKA
TRNN ISTAT,STMOD ;STATUS MODIFIER?
JRST RSRCH1 ;NO, TRY AGAIN
SETZM SRCNUM ;RESET SEARCH COUNT
ADDI E,1
CAMLE E,RWLAST
JRST RWDONE
DPB E,WNRN
CONSO PMP,CHE
JRST .-1
DATAO PMP,B
DATAO IBM,A
PUSHJ P,ESTAT ;NOW WAIT FOR TERMINATION OF LAST READ
SOJA E,REREAD
JRST ECHKB
ADDI D,RETLEN ;THIS ASSUMES RETLEN ≤ RECLEN
CAIE E,1 ;RECORD 0?
ADDI D,RECLEN-RETLEN ;NO, MAKE IT RECORD LENGTH
JRST RSTUFF
RWDONE: PUSHJ P,ESTAT ;WAIT FOR END OF FINAL READ
SOJA E,REREAD
CAIA
JRST CPOPJ1 ;SUCCESS
ECHKB: SUBI E,1
ECHKA: PUSH P,A
PUSH P,B
PUSH P,C
PUSH P,D
PUSH P,E
PUSHJ P,ESENSE
POP P,E
POP P,D
POP P,C
POP P,B
POP P,A
SOSL ECOUNT
JRST REREAD
POPJ P,
ECHK: SOSL ECOUNT
JRST REDAGN
POPJ P,
RSRCH1: AOS T,SRCNUM
CAIG T,100
JRST RSRCH2
OUTSTR[ASCIZ/TOO MANY LOSING SEARCHES!
/]
JRST ESENSE
RSRCH2: PUSH P,A
MOVE A,ADDR
TRO A,3 ;NO-OP TO CLEAR CHAINING
CONSO PMP,CHE ;WAIT FOR COMMAND HOLD EMPTY
JRST .-1
PUSHJ P,XCTCMD
JRST [ POP P,(P)
POPJ P,]
POP P,A
JRST RSRCH
RSRCH3: CONO IBM,RESET
MOVEI T,400000
CONSO IBM,NOPLIN
SOJG T,.-1
JUMPG T,RSRCH
OUTSTR[ASCIZ/OPL IN NEVER FELL!
/]
JRST ESENSE
;THE FOLLOWING CODE READS GRIMM'S FAIRY TALES FROM A 370 FORMAT PACK.
COMMENT %
BEGIN XREAD ;READ ONLY, OS-370 FORMAT
GLOBAL T,TT,A,B,C,D,E,IBM,PMP,P,ISTAT
↑XREAD: MOVEI T,CHAIN!DT!6!BY4 ;4 BYTE MODE
MOVEM T,RWCMD ;SAVE READ/WRITE COMMAND
MOVEI T,=61*3 ;NUMBER OF RECORDS*3
MOVEM T,ECOUNT
REDAGN: PUSHJ P,SEEKIT ;DO SEEK
JRST ECHK
SETZM BNDAT
SETZM BNDAT+1
MOVE T,TRACK
IDIVI T,TRKCYL
DPB T,WNCYL
DPB TT,WNHD
MOVE A,ADDR
TRO A,DT!BY4!CB!CHAIN!SMF!61 ;SEARCH ID EQUAL
MOVEI B,BNDAT
MOVE C,ADDR
TDO C,RWCMD
MOVE D,RWLOC ;DATA GOES TO (COMES FROM) HERE
MOVEI E,1 ;FIRST RECORD NUMBER
REREAD: DPB E,WNRN
SETZM SRCNUM
RSRCH: DATAO PMP,B
DATAO IBM,A
RSTUFF: CONSO PMP,CHE ;WAIT FOR COMMAND HOLD EMPTY
JRST .-1
CAIL E,=61 ;IS THIS LAST RECORD YET?
TRZ C,CHAIN ;YES. CLEAR CHAINING
DATAO PMP,D
DATAO IBM,C
PUSHJ P,ESTAT ;WAIT FOR ENDING STATUS OF SEARCH
JRST RSRCH1 ;RETRY SEARCH
JRST ECHKA
TRNN ISTAT,STMOD ;STATUS MODIFIER?
JRST RSRCH1 ;NO, TRY AGAIN
SETZM SRCNUM ;RESET SEARCH COUNT
ADDI E,1 ;ADVANCE TO NEXT RECORD
CAILE E,=61 ;IS THIS THE LAST RECORD TO READ?
JRST RWDONE ;YES.
DPB E,WNRN
CONSO PMP,CHE
JRST .-1
DATAO PMP,B
DATAO IBM,A
PUSHJ P,ESTAT ;NOW WAIT FOR TERMINATION OF LAST READ
SOJA E,REREAD ;LAST READ LOST.. BACKUP AND RETRY
JRST ECHKB
ADDI D,=20 ;80 BYTES = 20 WORDS. ADVANCE MA
JRST RSTUFF
RWDONE: PUSHJ P,ESTAT ;WAIT FOR END OF FINAL READ
SOJA E,REREAD
CAIA
JRST CPOPJ1 ;SUCCESS
ECHKB: SUBI E,1
ECHKA: PUSH P,A
PUSH P,B
PUSH P,C
PUSH P,D
PUSH P,E
PUSHJ P,ESENSE
POP P,E
POP P,D
POP P,C
POP P,B
POP P,A
SOSL ECOUNT
JRST REREAD
POPJ P,
ECHK: SOSL ECOUNT
JRST REDAGN
POPJ P,
RSRCH1: AOS T,SRCNUM
CAIG T,100
JRST RSRCH2
OUTSTR[ASCIZ/TOO MANY LOSING SEARCHES!
/]
JRST ESENSE
RSRCH2: PUSH P,A
MOVE A,ADDR
TRO A,3 ;NO-OP TO CLEAR CHAINING
CONSO PMP,CHE ;WAIT FOR COMMAND HOLD EMPTY
JRST .-1
PUSHJ P,XCTCMD
JRST [ POP P,(P)
POPJ P,]
POP P,A
JRST RSRCH
RSRCH3: CONO IBM,RESET
MOVEI T,400000
CONSO IBM,NOPLIN
SOJG T,.-1
JUMPG T,RSRCH
OUTSTR[ASCIZ/OPL IN NEVER FELL!
/]
JRST ESENSE
BEND XREAD
BEGIN GRIMM
GLOBAL T,P
GRTRK: =703*=19
GWTRK: 0
GRPACK: 2 ;READ PACK
GWPACK: 4 ;WRITE PACK
↑GRIMM: MOVEI T,=703*=19 ;READ TRACK
MOVEM T,GRTRK
SETZM GWTRK ;WRITE TRACK
GRLOOP: MOVE T,GRPACK
MOVEM T,DRIVE
DPB T,[POINT 3,ADDR,21]
LDB T,[POINT 8,ADDR,21]
DPB T,[POINT 8,TSTXOR,11]
MOVE T,GRTRK
MOVEM T,TRACK
MOVEI T,TRKBUF+40
MOVEM T,RWLOC ;READ DATA INTO TRKBUF+40
PUSHJ P,XREAD
OUTSTR [ASCIZ/READ ERROR
/]
MOVE T,GWPACK
MOVEM T,DRIVE
DPB T,[POINT 3,ADDR,21]
LDB T,[POINT 8,ADDR,21]
DPB T,[POINT 8,TSTXOR,11]
MOVE T,GWTRK
MOVEM T,TRACK
SETZM RWFIRST ;SET FIRST RECORD NUMBER TO WRITE
MOVEI T,RCPTRK ;NORMAL - DO ENTIRE TRACK
MOVEM T,RWLAST ;SET LAST RECORD TO WRITE
MOVEI T,TRKBUF
MOVEM T,RWLOC ;READ DATA INTO TRKBUF
PUSHJ P,WRITE
OUTSTR [ASCIZ/WRITE ERROR
/]
AOS GWTRK
AOS T,GRTRK
CAIG T,=723*=19+=17
JRST GRLOOP
OUTSTR [ASCIZ/DONE
/]
POPJ P,
BEND GRIMM
END OF COMMENTED PORTION %
FORMAT: TDZA T,T
OSFMT: MOVNI T,1
MOVEM T,OSFMTF ;FLAG SET FOR OS/370 FORMAT
SKIPE T
OUTSTR [ASCIZ /(OS-370 FORMAT)
/]
SETZM TRACK
FT0: MOVEI T,5 ;RETRY 5 TIMES IN QUIET MODE
MOVEM T,CNT
FT1: PUSHJ P,FTRACK ;FORMAT TRACK
JRST FLOSE
AOS T,TRACK ;NEXT TRACK
CAIG T,MAXTRK ;GREATER THAN MAXIMUM TRACK NUMBER?
JRST FT0
OUTSTR[ASCIZ/DONE, /]
MOVE A,TRACK
DECPNT A
OUTSTR[ASCIZ/ TRACKS FORMATTED.
/]
POPJ P,
FLOSE: SOSL CNT
JRST FT1
ERROR
OUTSTR[ASCIZ/FORMAT ERROR. /]
PUSHJ P,GETYES
POPJ P, ;NO
JRST FT1 ;TRY AGAIN
;FORMAT ONE TRACK
FTRACK: PUSHJ P,SEEKIT ;DO SEEK
POPJ P, ;ERROR
SETZM HADAT
SETZM HADAT+1
SETZM B0DAT
MOVE T,[XWD B0DAT,B0DAT+1]
BLT T,ENDDAT
MOVE T,TRACK
IDIVI T,TRKCYL ;DIVIDE BY TRACKS PER CYLINDER
DPB T,HACYL
DPB T,W0CYL
DPB T,WNCYL
DPB T,WMCYL
DPB TT,HAHD
DPB TT,W0HD
DPB TT,WNHD
DPB TT,WMHD
MOVEI T,RETBYT ;NUMBER OF BYTES OF RETRIEVAL
SKIPE OSFMTF ;OS FORMAT?
MOVEI T,=8 ;YES - 8 BYTES OF DATA IN R0
DPB T,W0DL1
LSH T,-=8
DPB T,W0DL0
MOVEI T,KEYBYT ;KEY AREA BYTES (R0 ONLY)
SKIPE OSFMTF ;OS FORMAT?
MOVEI T,0 ;YES - NO KEY IN R0
DPB T,W0KL
MOVEI T,RECBYT ;NUMBER OF BYTES/RECORD (DATA AREA - NOT RETRIEVAL)
DPB T,WNDL1
DPB T,WMDL1
LSH T,-=8
DPB T,WNDL0
DPB T,WMDL0
MOVE A,ADDR
TRO A,37!DT!BY4!CB!CHAIN ;SET FILE MASK COMMAND
MOVEI B,FILMSK ;PERMIT ALL WRITES
PUSHJ P,XCTCMD ;XCT SET FILE MASK
POPJ P, ;ERROR
MOVE C,ADDR
TRO C,25!DT!BY4!CB!CHAIN;SETUP FOR WRITE RECORD 0
SKIPE OSFMTF ;OS FORMAT?
TRZ C,CHAIN ;YES. WRITE R0 IS THE LAST FORMAT OPERATION
MOVE D,ADDR
TRO D,35!DT!BY4!CB!CHAIN;SETUP FOR WRITE COUNT KEY AND DATA
MOVEI E,BNDAT
MOVEI F,BMDAT
MOVE A,ADDR
TRO A,31!DT!BY4!CB!CHAIN;WRITE HOME ADDRESS
MOVEI B,HADAT
DATAO PMP,B
DATAO IBM,A ;WRITE HOME ADDRESS
CONSO PMP,CHE ;WAIT FOR COMMAND HOLD EMPTY
JRST .-1
DATAO PMP,[B0DAT]
DATAO IBM,C ;WRITE R0
PUSHJ P,ESTAT ;GET ENDING STATUS OF WRITE HOME ADDRESS
JFCL
JRST ESENSE
SKIPE OSFMTF ;OS FORMAT?
JRST RECLP3 ;YES. JUST WAIT FOR WRITE R0 TO FINISH
MOVEI C,1
RECLOP: DPB C,WNRN
CONSO PMP,CHE ;WAIT FOR SPACE
JRST .-1
DATAO PMP,E
DATAO IBM,D
PUSHJ P,ESTAT
JFCL
JRST ESENSE ;ERROR
ADDI C,1 ;NEXT RECORD
CAIGE C,RCPTRK
JRST RECLP1
TRZN D,CHAIN
JRST RECLP2
RECLP1: DPB C,WMRN
CONSO PMP,CHE
JRST .-1
DATAO PMP,F
DATAO IBM,D
PUSHJ P,ESTAT
JFCL
JRST ESENSE
ADDI C,1
CAIL C,RCPTRK
TRZE D,CHAIN
JRST RECLOP
RECLP2: PUSHJ P,ESTAT ;WAIT FOR END OF LAST WRITE CKD
JFCL
JRST ESENSE ;ERROR
JRST CPOPJ1 ;SUCCESS
RECLP3: PUSHJ P,ESTAT ;WAIT FOR END THE WRITE R0 OSFMT COMMAND ONLY!
JFCL
JRST ESENSE ;ERROR
MOVEI C,16000 ;TIME CONSTANT - WAIT FOR ERASE THAT FOLLOWS WRITE R0
SOJGE C,. ;SPIN WHEELS. AVOID CU BUSY & RELATED LOSSAGE
JRST CPOPJ1 ;SUCCESS
SEEKIT: SETZM SKDAT
SETZM SKDAT+1
MOVE T,TRACK
IDIVI T,TRKCYL
DPB T,SKCYL
DPB TT,SKHD
MOVE A,ADDR
TRO A,7!DT!BY4!CB!CHAIN ;SEEK CYL AND HEAD ;CHAIN 8-15-75
MOVEI B,SKDAT
PUSHJ P,XCTCMD
POPJ P,
MOVE A,ADDR
TRO A,3 ;NOOP CHAINED FROM SEEK 8-15-75
PUSHJ P,XCTCMD
POPJ P,
JRST CPOPJ1 ;YES, ALL DONE
DOSEEK: PUSHJ P,SEEKIT
OUTSTR[ASCIZ/SEEK ERROR!
/]
POPJ P,
HAREAD: SETZM HADAT
SETZM HADAT+1
MOVE A,ADDR
TRO A,32!DT!BY4!CB
MOVEI B,HADAT
PUSHJ P,XCTCMD
JRST HALOSE
LDB A,HACYL
OUTSTR[ASCIZ/CYLINDER = /]
DECPNT A
LDB B,HAHD
OUTSTR[ASCIZ/ HEAD = /]
DECPNT B
IMULI A,TRKCYL
ADD A,B
OUTSTR[ASCIZ/ TRACK = /]
DECPNT A
OUTSTR[ASCIZ/
/]
POPJ P,
HALOSE: OUTSTR[ASCIZ/READ HOME ADDRESS FAILED!
/]
POPJ P,
DORECAL:PUSHJ P,RECAL
CAIA
POPJ P,
PUSHJ P,ESENSE
OUTSTR[ASCIZ/RECALIBRATE FAILED
/]
POPJ P,
RECAL: MOVE A,ADDR
TRO A,23
PUSHJ P,DOCMD ;RECALIBRATE
JRST .-1 ;RETRY!
POPJ P,
JRST CPOPJ1
SECTOR: OUTSTR[ASCIZ/SECTOR NUMBER?/]
PUSHJ P,READN
JFCL
CAIE A,12
CAIN A,15
CAIA
JRST ILLSEC
DPB T,[POINT 8,B0DAT,7]
MOVE A,ADDR
TRO A,DT!BY4!CB!43
MOVEI B,B0DAT
PUSHJ P,XCTCMD ;ISSUE SET SECTOR
JRST SECFAI
MOVE A,ADDR
TRO A,DT!CB!BY4!22 ;READ COUNT
PUSHJ P,XCTCMD
JRST SECFAI
OUTSTR[ASCIZ/RECORD = /]
LDB A,[POINT 8,B0DAT+1,7]
DECPNT A
OUTSTR[ASCIZ/
/]
POPJ P,
SECFAI: OUTSTR[ASCIZ\SET SECTOR/READ COUNT FAILED
\]
POPJ P,
ILLSEC: PUSHJ P,SKIP
CAIA ;HE SEEMS TO KNOW IT'S ILLEGAL
OUTSTR[ASCIZ/ILLEGAL SECTOR!
/]
POPJ P,
IL2314: OUTSTR[ASCIZ/NOT AVAILABLE ON 2314!
/]
POPJ P,
RSECTOR:MOVEI B,B0DAT
MOVE A,ADDR
TRO A,DT!CB!BY4!42 ;READ SECTOR
PUSHJ P,XCTCMD
JRST RSCFAI
OUTSTR[ASCIZ/SECTOR = /]
LDB A,[POINT 8,B0DAT,7]
DECPNT A
OUTSTR[ASCIZ/
/]
POPJ P,
RSCFAI: OUTSTR[ASCIZ/READ SECTOR FAILED.
/]
POPJ P,
DOSENSE:PUSHJ P,SENSE
JRST LOSENSE
MOVEM ISTAT,ISTATC
PUSHJ P,ERRPNT
POPJ P,
LOSENSE:MOVEM ISTAT,ISTATC
PUSHJ P,STTPNT
PUSHJ P,IBLAST
POPJ P,
DONOOP: MOVE A,ADDR
TRO A,3 ;NOOP
PUSHJ P,XCTCMD
OUTSTR[ASCIZ/NOOP ERROR!
/]
POPJ P,
BUFLOG: MOVEI B,SNSDAT
MOVE A,ADDR
TRO A,DT!CB!BY4!244
PUSHJ P,XCTCMD
JRST LOGLOS
OUTSTR[ASCIZ/ERROR-USAGE STATISTICS:
/]
MOVEI A,0 ;START WTH BYTE 0
MOVE B,[POINT 8,SNSDAT]
BUFLOP: ILDB C,B
JUMPE C,BUFLP1
OUTSTR[ASCIZ/BYTE /]
DECPNT A
OUTSTR[ASCIZ/ = /]
LOCPNT C
OUTSTR[ASCIZ/
/]
BUFLP1: CAIGE A,=23
AOJA A,BUFLOP
POPJ P,
LOGLOS: OUTSTR[ASCIZ/READ AND RESET BUFFERED LOG LOST!
/]
POPJ P,
DIAG: PUSHJ P,LOAD
JRST ERLOAD
UDIAG: MOVEI T,4
DPB T,[POINT 8,B0DAT,7]
MOVEI B,B0DAT
MOVE A,ADDR
TRO A,DT!BY4!CB!CHAIN!37
PUSHJ P,XCTCMD ;SET FILE MASK TO PERMIT
JRST ERDIAG ;DIAGNOSTIC WRITE
MOVEI B,TSTBUF
MOVE A,ADDR
TRO A,CB!BY4!DT!CHAIN!163 ;DIAGNOSTIC WRITE
PUSHJ P,XCTCMD
JRST ERDIAG
MOVEI B,ERRBUF
MOVE A,ADDR
TRO A,DT!CB!BY4!104 ;READ DIAGNOSTIC STATUS 1
PUSHJ P,XCTCMD
JRST ERRERR
POPJ P,
DOLOAD: PUSHJ P,LOAD
ERLOAD: OUTSTR[ASCIZ/LOADING ERROR!
/]
POPJ P,
ERDIAG: OUTSTR[ASCIZ/ERROR IN DIAGNOSTIC WRITE!
/]
POPJ P,
ERRERR: OUTSTR[ASCIZ/ERROR IN READ DIAGNOSTIC STATUS 1.
/]
POPJ P,
LOAD: OUTSTR[ASCIZ/HEX TEST ADDR?/]
PUSHJ P,HEXIN
CAIG T,377
CAIE A,15
JRST ILDADR
DPB T,[POINT 8,B0DAT,7]
MOVEI B,B0DAT
MOVE A,ADDR
TRO A,DT!CB!BY4!CHAIN!123
PUSHJ P,XCTCMD ;DIAGNOSTIC LOAD
POPJ P,
MOVEI B,TSTBUF
MOVE A,ADDR
TRO A,DT!CB!BY4!104
PUSHJ P,XCTCMD ;READ DIAGNOSTIC STATUS 1
POPJ P,
JRST CPOPJ1
ILDADR: OUTSTR[ASCIZ/ILLEGAL HEX ADDRESS!
/]
POPJ P,
HEXIN: SETZ T,
HEXIN1: GETCHR A
CAIG A,"9"
CAIGE A,"0"
CAIA
JRST ISDIG
CAIG A,"F"
CAIGE A,"A"
POPJ P,
SUBI A,"A"-"9"-1
ISDIG: IMULI T,=16
ADDI T,-60(A)
JRST HEXIN1
DOCMD: TRNE A,20000 ;SHOULD WE SEND WCMA
DATAO PMP,B ;SEND WCMA
DATAO IBM,A ;AND COMMAND
ESTAT: MOVSI T,4 ;ABOUT 4 SECONDS
ESTAT0: CONSZ PMP,UNEND!NEWST
JRST ESTAT1
SOJG T,ESTAT0
JRST CPOPJ1
ESTAT1: GETSTAT
XOR ISTAT,TSTXOR
TDNE ISTAT,[377B11] ;SOMEBODY ELSE?
JRST RNDINT ;RANDOM INTERRUPT
XOR ISTAT,TSTXOR
TRNE ISTAT,UNEND!UXCPTN ;UNEND, ILL STATUS
JRST ILLCHK
TRNE ISTAT,CHEND
TRNE ISTAT,DEVEND
JRST CPOPJ2
JRST ESTAT
RNDINT: XOR ISTAT,TSTXOR
OUTSTR[ASCIZ/ASYNCHRONOUS INTERRUPT
DRIVE = /]
LDB T,[POINT 3,ISTAT,11]
PUTCHR 60(T)
LDB T,[POINT 5,ISTAT,8]
CAIE T,D3330
OUTSTR[ASCIZ/ UNKNOWN DEVICE CODE/]
OUTSTR[ASCIZ/
/]
JRST ESTAT ;WAIT FOR REAL STATUS
ILLCHK: SKIPE DEBUG
PUSHJ P,DDTCAL
TRNN ISTAT,STMOD ;MUST BE ON FOR CU BUSY OR RETRY STATUS!
JRST CPOPJ1 ;ERROR
TRNE ISTAT,BUSY ;CU BUSY?
JRST CUBUSY
TRNN ISTAT,UCHK ;RETRY?
JRST CPOPJ1 ;ERROR
AOS RTYCNT
TRNE ISTAT,DEVEND ;DEVICE END ALREADY?
JRST CPOPJ1 ;YES, INDICATE RETRY
MOVEI TT,;DEVEND
WAIT: MOVSI T,4
CONO IBM,CLRCHL ;CLEAR NEW STATUS, UNEND, AND CMD HOLD LOADED
CONSO PMP,UNEND!NEWST
SOJG T,.-1
JUMPLE T,CPOPJ1 ;ERROR
GETSTAT
TRNN ISTAT,UNEND!UXCPTN
TDNN ISTAT,TT ;DID WE GET WHAT WE WANTED?
JRST CPOPJ1 ;NO, ERROR
POPJ P, ;INDICATE RETRY STATUS
CUBUSY: AOS CUBCNT
TRNE ISTAT,CUEND ;CUEND WITH CU BUSY?
POPJ P, ;YES, INDICATE RETRY STATUS
MOVEI TT,CUEND
JRST WAIT
XCTCMD: PUSHJ P,DOCMD
JRST XCTCMD ;RETRY STATUS!
JRST ESENSE ;ERROR, DO SENSE
JRST CPOPJ1
SENSE: MOVE A,ADDR
TRO A,4!DT!BY4!CB ;SENSE
MOVEI B,SNSDAT
MOVEI C,10 ;RETRY TEN TIMES AT MOST!
PUSHJ P,DOCMD ;DO SENSE
SOJG C,.-1 ;RETRY STATUS
POPJ P,
JRST CPOPJ1
ESENSE: AOS ERRCNT
MOVEM ISTAT,ISTATC
SKIPN QUIET
PUSHJ P,STTPNT
PUSHJ P,BLAST
PUSHJ P,SENSE
JRST LOSEN1
LDB A,[POINT 8,SNSDAT,7]
TRNE A,1
JRST ISSKCK
TRNN A,20
JRST NOSKCK
LDB A,[POINT 8,SNSDAT+1,31]
CAIE A,52
CAIN A,53
CAIA
JRST NOSKCK
ISSKCK: PUSHJ P,RECAL ;RECALIBRATE HYDRAULICS(ELCTRONICS)
OUTSTR[ASCIZ/RECALIBRATE FAILED!
/]
NOSKCK: SKIPE QUIET
POPJ P,
CAIA
ERRPNT: PUSHJ P,STTPNT
LDB A,[POINT 8,SNSDAT,7] ;FIRST SENSE BYTE
MOVEI B,7
SNTY0: TRNE A,200
OUTSTR @SNBY0(B)
LSH A,1
SOJGE B,SNTY0
MOVEI B,7
LDB A,[POINT 8,SNSDAT,15]
SNTY1: TRNE A,200
OUTSTR @SNBY1(B)
LSH A,1
SOJGE B,SNTY1
LDB A,[POINT 8,SNSDAT+1,7]
CAIN A,10
SKIPA A,[11]
ANDI A,7
ADDI A,1
ADDI A,100
OUTSTR[ASCIZ/DRIVE = /]
PUTCHR @A
LDB A,[POINT 5,ISTATC,8]
CAIE A,D3330
OUTSTR[ASCIZ/
ILLEGAL DEVICE ADDRESS/]
OUTSTR[ASCIZ/
SENSE DATA:
/]
MOVE A,[POINT 8,SNSDAT]
MOVEI B,=24
SETZ D,
BYTLOP: ILDB C,A
JUMPE C,BYTLP1
OUTSTR[ASCIZ/BYTE /]
DECPNT D
OUTSTR[ASCIZ/ = /]
LOCPNT C
OUTSTR[ASCIZ/
/]
BYTLP1: ADDI D,1
SOJG B,BYTLOP
CNTPNT: SKIPN RTYCNT
JRST CUBPNT
OUTSTR[ASCIZ/RTYCNT = /]
DECPNT RTYCNT
OUTSTR[ASCIZ/
/]
SETZM RTYCNT
CUBPNT: SKIPN CUBCNT
JRST ERRP
OUTSTR[ASCIZ/CUBCNT = /]
DECPNT CUBCNT
OUTSTR[ASCIZ/
/]
SETZM CUBCNT
ERRP: SKIPN ERRCNT
POPJ P,
OUTSTR[ASCIZ/ERRCNT = /]
DECPNT ERRCNT
OUTSTR[ASCIZ/
/]
SETZM ERRCNT
POPJ P,
STTPNT: OUTSTR[ASCIZ/CONI BITS = /]
OCTPNT ISTATC
OUTSTR[ASCIZ/
PACK = /]
LDB A,[POINT 3,ISTATC,11]
PUTCHR 60(A)
OUTSTR[ASCIZ/ TRACK = /]
DECPNT TRACK
OUTSTR[ASCIZ/
/]
MOVE A,ISTATC
TLNE A,200000 ;NXM?
OUTSTR[ASCIZ/NON-EX-MEM
/]
TLNE A,40000
OUTSTR[ASCIZ/SELECT ERROR
/]
TLNE A,40
OUTSTR[ASCIZ/DISK PARITY ERROR
/]
TLNE A,20
OUTSTR[ASCIZ/CORE PARITY ERROR
/]
LDB A,[POINT 8,ISTATC,30]
MOVSI B,-DSTATL
STATLP: HLRZ C,DSTAT(B)
CAME C,A
AOBJN B,STATLP
JUMPGE B,ILSTAT
HRRZ C,DSTAT(B)
OUTSTR @C
OUTSTR[ASCIZ/
/]
POPJ P,
ILSTAT: MOVEI B,7
TRNE A,1
OUTSTR @STATAB(B)
LSH A,-1
SOJG B,.-3
POPJ P,
LOSEN1: OUTSTR[ASCIZ/SENSE LOST!
/]
PUSHJ P,IBLAST
POPJ P,
BLAST: CONI PMP,T
TLNE T,SELERR ;SELECT ERROR?
IBLAST: CONO IBM,RESET!IRESET ;RESET CHANNEL AND DISK CONTROL
MOVEI T,3
BLAST1: MOVEI TT,4000
CONO IBM,RESET ;RESET CHANNEL SOME MORE
SOJG TT,.
SOJG T,BLAST1
POPJ P,
END STRT